package cn.tuzirpa;

import cn.tuzirpa.config.DatabaseConfig;
import cn.tuzirpa.executor.SqlFileExecutor;
import cn.tuzirpa.manager.DatabaseManager;
import cn.tuzirpa.tracker.SqlExecutionTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 命令行版本的主程序
 * 通过命令行参数配置，避免交互式输入
 */
public class CommandLineApp {
    
    private static final Logger logger = LoggerFactory.getLogger(CommandLineApp.class);
    
    public static void main(String[] args) {
        logger.info("=== 数据库初始化工具包（命令行版本） ===");
        
        if (args.length < 4) {
            printUsage();
            return;
        }
        
        try {
            // 解析命令行参数
            String url = args[0];
            String username = args[1];
            String password = args[2];
            String databaseName = args[3];
            String charset = args.length > 4 ? args[4] : "utf8mb4";
            String sqlDirectory = args.length > 5 ? args[5] : "sql-examples";
            
            // 创建配置
            DatabaseConfig config = new DatabaseConfig(url, username, password, databaseName, charset);
            logger.info("数据库配置: {}", config);
            
            // 创建数据库管理器
            DatabaseManager databaseManager = new DatabaseManager(config);
            
            // 测试连接
            if (!testDatabaseConnection(databaseManager)) {
                logger.error("数据库连接失败，程序退出");
                return;
            }
            
            // 创建数据库（如果不存在）
            createDatabaseIfNotExists(databaseManager);
            
            // 创建执行跟踪器
            SqlExecutionTracker executionTracker = new SqlExecutionTracker(databaseManager);
            
            // 创建SQL执行器
            SqlFileExecutor sqlExecutor = new SqlFileExecutor(databaseManager, executionTracker);
            
            // 执行SQL文件目录
            logger.info("开始执行SQL文件目录: {}", sqlDirectory);
            sqlExecutor.executeSqlFiles(sqlDirectory);
            logger.info("SQL文件执行完成");
            
            // 查看执行历史
            System.out.println("\n执行历史:");
            executionTracker.printExecutionHistory();
            
            // 关闭资源
            databaseManager.close();
            
        } catch (Exception e) {
            logger.error("程序执行失败", e);
        }
    }
    
    /**
     * 测试数据库连接
     */
    private static boolean testDatabaseConnection(DatabaseManager databaseManager) {
        logger.info("测试数据库连接...");
        
        if (databaseManager.testBaseConnection()) {
            logger.info("基础数据库连接测试成功");
        } else {
            logger.error("基础数据库连接测试失败");
            return false;
        }
        
        return true;
    }
    
    /**
     * 创建数据库（如果不存在）
     */
    private static void createDatabaseIfNotExists(DatabaseManager databaseManager) {
        logger.info("检查数据库是否存在...");
        
        if (!databaseManager.databaseExists()) {
            logger.info("数据库不存在，开始创建...");
            databaseManager.createDatabase();
        } else {
            logger.info("数据库已存在，跳过创建");
        }
    }
    
    /**
     * 打印使用说明
     */
    private static void printUsage() {
        System.out.println("使用方法:");
        System.out.println("java -cp target/classes cn.tuzirpa.CommandLineApp <url> <username> <password> <database> [charset] [sqlDirectory]");
        System.out.println();
        System.out.println("参数说明:");
        System.out.println("  url         数据库URL (例如: jdbc:mysql://localhost:3306)");
        System.out.println("  username    数据库用户名");
        System.out.println("  password    数据库密码");
        System.out.println("  database    数据库名");
        System.out.println("  charset     字符编码 (可选，默认: utf8mb4)");
        System.out.println("  sqlDirectory SQL文件目录 (可选，默认: sql-examples)");
        System.out.println();
        System.out.println("示例:");
        System.out.println("java -cp target/classes cn.tuzirpa.CommandLineApp jdbc:mysql://localhost:3306 root 123456 my_db utf8mb4 sql-examples");
    }
}
